const mammoth = require('mammoth');
const axios = require("axios");
// 将文本提出出来的关键字数组 提取成一个json格式的字符串
function analysisText_to_JSON(fields) {
  let json = {};
  let blackList = [];
  fields.forEach((item, index) => {
    // 如果当前元素在已经单独处理过了 就跳过
    if (blackList.includes(item)) return;
    if (item.includes(".")) {
      // 判断 item 是不是存在 . 如果存在 就提取成对象
      let arr = item.split(".");

      if (typeof json[arr[0]] != "object") {
        json[arr[0]] = {};
      }
      json[arr[0]][arr[1]] = "";
    } else if (item.includes("#")) {
      // 记录当前位置 并且找到下一个 /xxx 所在的位置
      let ind = index;
      let nextIndex = fields.indexOf("/" + item.split("#")[1]);
      let newArray = fields.slice(ind, nextIndex + 1);
      // newArray 里面的数据需要单独处理 加入黑名单 下次fields碰到里面的数据的话需要跳过
      blackList.push(...newArray);
      let processingData = arrayToJsonStructure(newArray);
      for (let key in processingData) {
        json[key] = processingData[key];
      }
    } else {
      json[item] = "";
    }
  });
  
  function arrayToJsonStructure(arr, obj = {}) {
    // 如果 arr 不是一个数组或者不是一个对象 就抛出错误
    if (!Array.isArray(arr) || typeof obj !== "object") {
      throw new Error("Invalid input");
    }
    // 定义递归函数
    function processArray(arr, currentObj) {
      // 初始化空容器
      let keyStack = [];
      // 重新赋值 currentObj
      let currentLevel = currentObj;

      // 遍历数组
      arr.forEach((item) => {
        // 判断 item 的开头 如果 item 是以 # 开头的，说明是一个新的键，将键名添加到栈中，并创建一个新对象作为当前层级的值，并将当前层级指向该对象
        if (item.startsWith("#")) {
          const key = item.split("#")[1];
          keyStack.push(key);
          currentLevel[key] = [{}];
          currentLevel = currentLevel[key][0];
        } else if (item.startsWith("/")) {
          // 判断 item 的开头 如果 item s是以 / 开头的，说明是一个关闭的标签，将栈中的最后一个键名弹出，并更新当前层级为栈中的最后一个键名对应的对象
          const keyToRemove = item.slice(1);
          keyStack.pop();
          currentLevel = keyStack.reduce(
            (acc, key) => acc[key] && acc[key][0],
            currentObj
          );
          // If the last item is a closing tag, we might not need to process it further
          if (keyToRemove === keyStack[keyStack.length - 1]) {
            return; // Exit early as we've reached the top level again
          }
        } else {
          currentLevel[item] = "";
        }
      });
    }

    processArray(arr, obj);
    return obj;
  }

  return json;
}

exports.main = async (event, context) => {
	try {

		// 使用 axios 从远程 URL 下载文件，并指定响应类型为 arraybuffer
		const response = await axios({
			method: "get",
			url: event.url,
			responseType: "arraybuffer",
		});

		// 使用 mammoth.js 将下载的 ArrayBuffer 转换为 HTML
		let options = {};
		const result = await mammoth.convertToHtml({
				buffer: response.data,
			},
			options
		);

		// 将html文件 转为纯 text 文件
		const stripHTMLTags = (str) => str.replace(/<\/?[^>]+(>|$)/g, "");
		
		console.log(result.value , 'result.value');
		
		const plainText = stripHTMLTags(result.value);

		const regex = /{([^}]+)}/g;
		let match;
		const fields = [];

		// 提出text文件中的关键字
		while ((match = regex.exec(plainText)) !== null) {
			fields.push(match[1]); // match[1] 是括号内捕获的内容
		}

		let json = analysisText_to_JSON(fields)
		
		console.log(JSON.stringify(json), 'json');

		return {
			code: 200,
			message: "操作成功",
			data: JSON.stringify(json)
		}
	} catch (error) {
		// 处理任何下载或转换过程中发生的错误
		console.error("Error downloading or converting file:", error);
		return {
			code: 500,
			message: "操作失败"
		}
	}

};